javascript策略模式总结

1.什么是策略模式?

策略模式的定义是:定义一系列的算法,把他们独立封装起来,并且可以相互替换。

例如我们需要写一段代码来计算员工的奖金。当绩效为a时,奖金为工资的5倍,绩效为b时,奖金为工资的3倍,绩效为c时,奖金为工资的1.5倍:

var strategy = {
    "a":function(salary){
        return salary*5;
    },
    "b":function(salary){
        return salary*3;
    },
    "c":function(salary){
        return salary*1.5;
    }            
};

var calculate = function(levle,salary){
    return strategy[levle](salary);
}

//a级奖金
calculate('a',15000);

上面例子中,各种绩效对应着不同的算法,因此把他们封装在strategy里。calculate负责接受请求,然后把请求委托给指定的
策略类。这种实现方式,就是策略模式。

2.策略模式的优势

看回上面的例子,具体的算法和接受请求的函数是相互独立的,当我们需要添加新的等级d时,只需要在strategy中添加相应的算法就可以了,不需要修改到calculate,十分的灵活。

3.策略模式的使用

如果策略模式仅仅是用来封装算法,可能有点小才大用了。在实际开发中,可以用来封装一系列的业务规则,并且灵活的调用它们。
例如在表单验证中,就常常会使用到策略模式。

var strategy = {
    isNotEmpty:function(val,errorMsg){  //不为空
        if(val === ""){
            return errorMsg;
        }
    }
    isMobile:function(val,errorMsg){  //手机号
        if(!/^1[3|5|8][0-9]{9}$/.test(val)){
            return errorMsg;
        }
    }
}

//实现validator,负责接收请求。
var Validator = function(){
    this.cache = [];
};
Validator.protype.add = function(dom,rule,errorMsg){
        this.cache.push(function(){
            return strategy[rule](dom.value,errorMsg);
        })
};
Validator.protype.start = function(){
    var len = this.cache.length;
    for(var i = 0 ; i<len; i++){
        var msg = this.cache[i];
        if(msg){
            return msg;
        }
    }
};

var validatorFun = function(){
    var validator    = new Validator();
    validator.add($("#username"),'isNotEmpty','用户名不为空');
    validator.add($("#mobile"),'isMobile','手机号码格式错误');

    var errorMsg = validator.start();
    return errorMsg;
};


//调用验证
var errormsg = validatorFun();
if(errormsg){
    alert(errormsg);
    return false;
}

> 使用策略模式之后,我们可以用过配置strategy来添加验证规则,可以很好的进行复用,避免了很多条件选择语句和代码的复制粘贴。

原文链接:javascript设计模式--策略模式

上一篇:javascript设计模式--单例模式


hczhi88
228 声望5 粉丝

前端开发工程师